package com.etl.borrow.service;

import com.etl.borrow.model.Borrow;
import com.etl.borrow.model.BorrowData;
import com.xr.service.IBaseService;

/**
 * <p>
 * 借款项目 服务类
 *
 * 借款项目状态变化：初审->复审->等待发标->投标中->已满标->还款中->还款结束
 * </p>
 *
 * @author Arnold Yang
 * @since 2018-03-24
 */
public interface IBorrowService extends IBaseService<Borrow> {

  /**
   * 借款项目申请
   *
   * @param borrowInfo
   * @return 标的id
   * @throws Exception
   */
  Long apply(Borrow borrowInfo) throws Exception;

  /**
   * 拒绝此借款项目
   *
   * 状态变为 com.etl.borrow.enums.BorrowStatus#REFUSE
   *
   * @param borrowId
   * @param borrowData
   * @throws Exception
   */
  void refuse(long borrowId, BorrowData borrowData) throws Exception;

  /**
   * 借款项目 初审
   *
   * 审核内容：
   * 借款信息是否正确，如：金额、利率、期数等
   * 各种费用收取，如：审核费等
   * 各种认证材料，如：身份证照片、企业营业执照、许可证等
   *
   * 通过：
   * 记录审核意见
   * 进入复审流程，状态变为 com.etl.borrow.enums.BorrowStatus#RECHECK
   *
   * 拒绝：
   * 记录拒绝原因
   * 状态变为 com.etl.borrow.enums.BorrowStatus#REFUSE
   *
   * @param borrowId
   * @param borrowData
   * @throws Exception
   */
  void check(long borrowId, BorrowData borrowData) throws Exception;

  /**
   * 借款项目 复审
   *
   * 审核内容：
   * 担保人是否正确
   * 各种费用收取，如：借款服务费、账户管理费等
   * 各种认证材料，如：身份证照片、企业营业执照、许可证等
   * 各种审核意见
   *
   * 通过：
   * 记录审核意见
   * 进入等待发标流程，状态变为 com.etl.borrow.enums.BorrowStatus#CHECKED_BID
   *
   * 拒绝：
   * 记录拒绝原因
   * 状态变为 com.etl.borrow.enums.BorrowStatus#REFUSE
   *
   * @param borrowId
   * @param borrowData
   * @throws Exception
   */
  void recheck(long borrowId, BorrowData borrowData) throws Exception;

  /**
   * 借款项目 审核通过，发布标的
   *
   * 主要内容：
   * 设置标的的各种配置信息，如：最低投标金额、投资限额、开始投标时间等
   *
   * 记录审核意见
   * 进入投标流程，状态变为 com.etl.borrow.enums.BorrowStatus#IN_BID
   * 投标完成后，进入满标终审流程，状态变为 com.etl.borrow.enums.BorrowStatus#FULL_BID
   *
   * @param borrowId
   * @throws Exception
   */
  void release(long borrowId) throws Exception;

  /**
   * 借款项目 已满标，满标终审
   *
   * 进入还款流程，状态变为 com.etl.borrow.enums.BorrowStatus#IN_REPAYMENT
   *
   * @param borrowId
   * @throws Exception
   */
  void fullBid(long borrowId) throws Exception;
}
